package Java2Test.Reflect.Reflect6;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 反射实现动态对象创建与方法调用
 * 通过属性文件配置类名和方法名，实现运行时动态加载类
 */
public class Demo1 {
    public static void main(String[] args) throws IOException, ClassNotFoundException,
            NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {

        // 读取属性文件
        Properties prop = new Properties();
        FileInputStream fis = new FileInputStream("prop.properties");
        prop.load(fis);
        fis.close();
        System.out.println("配置内容: " + prop);

        // 从配置中获取类名和方法名
        String className = (String) prop.get("classname");
        String methodName = (String) prop.get("method");
        System.out.println("类名: " + className);
        System.out.println("方法名: " + methodName);

        // 反射动态加载类并创建实例
        Class<?> clazz = Class.forName(className);                // 1. 加载类
        Constructor<?> constructor = clazz.getDeclaredConstructor(); // 2. 获取无参构造器
        Object instance = constructor.newInstance();              // 3. 创建实例
        System.out.println("实例: " + instance);

        // 反射调用方法
        Method method = clazz.getDeclaredMethod(methodName);      // 获取方法
        method.setAccessible(true);                               // 允许访问私有方法
        method.invoke(instance);                                  // 调用方法
    }
}